/**
 * Axios 请求封装
 */
import axios, { AxiosInstance, AxiosResponse, AxiosError } from 'axios';
import { message } from 'antd';

// 响应数据接口
export interface ResponseData<T = any> {
  code: number;
  message: string;
  data: T;
}

// 分页参数
export interface PaginationParams {
  page: number;
  page_size: number;
}

// 分页响应
export interface PaginatedResponse<T> {
  total: number;
  page: number;
  page_size: number;
  items: T[];
  total_pages: number;
}

// 创建 axios 实例
const request: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8000/api/v1',
  timeout: 660000, // 11分钟，DeepSeek-R1推理模型需要较长时间（后端600秒+余量）
  headers: {
    'Content-Type': 'application/json',
  },
});

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 可以在这里添加 token
    // const token = localStorage.getItem('token');
    // if (token) {
    //   config.headers.Authorization = `Bearer ${token}`;
    // }
    return config;
  },
  (error: AxiosError) => {
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse<ResponseData>) => {
    const { code, message: msg } = response.data;
    
    // 业务成功
    if (code === 200) {
      return response;
    }
    
    // 业务失败
    message.error(msg || '请求失败');
    return Promise.reject(new Error(msg || '请求失败'));
  },
  (error: AxiosError<ResponseData>) => {
    // HTTP 错误
    if (error.response) {
      const { status, data } = error.response;
      const errorMessage = data?.message || error.message || '请求失败';
      
      switch (status) {
        case 400:
          message.error(`请求错误: ${errorMessage}`);
          break;
        case 401:
          message.error('未授权，请登录');
          // 可以在这里跳转到登录页
          break;
        case 403:
          message.error('拒绝访问');
          break;
        case 404:
          message.error('请求的资源不存在');
          break;
        case 500:
          message.error('服务器错误');
          break;
        default:
          message.error(errorMessage);
      }
    } else if (error.request) {
      // 特殊处理超时错误
      if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
        message.error({
          content: 'AI评估超时，推理模型需要较长时间。建议：1) 使用"混合评估"模式（更快） 2) 检查Ollama服务是否正常',
          duration: 8,
        });
      } else {
        message.error('网络错误，请检查网络连接');
      }
    } else {
      message.error('请求配置错误');
    }
    
    return Promise.reject(error);
  }
);

export default request;
